package top.zhangjianyong.tools.etf;

import lombok.Data;
import top.zhangjianyong.tools.entity.ETF;
import top.zhangjianyong.tools.entity.ETFData;

import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * @author ： zhangjianyong
 * @date ： 2022/12/22 4:52 PM
 */
@Data
public class ETFHolder {

    //持有etf信息
    private Map<String, ETFHoldInfo> ETF_HOLD_MAP = new HashMap<>();

    private Map<String, List<ETFData>> ETF_DATE_HOLD_MAP = new HashMap<>();

    public void putDateMap(String code, List<ETFData> list) {
        ETF_DATE_HOLD_MAP.put(code, list);
    }

    public List<ETFData> getDateMap(String code) {
        return ETF_DATE_HOLD_MAP.get(code);
    }

    public void putETF(ETF etf, BigDecimal money, BigDecimal unit) {
        ETFHoldInfo etfHoldInfo = ETF_HOLD_MAP.getOrDefault(etf.getCode(), new ETFHoldInfo(etf));
        etfHoldInfo.setBuyMoney(etfHoldInfo.getBuyMoney().add(money));
        etfHoldInfo.setUnit(etfHoldInfo.getUnit().add(unit));
        ETF_HOLD_MAP.put(etf.getCode(), etfHoldInfo);
    }

    public void putETF(String code, ETFHoldInfo etfHoldInfo) {
        ETF_HOLD_MAP.put(code, etfHoldInfo);
    }

    public ETFHoldInfo getETF(String code) {
        return ETF_HOLD_MAP.get(code);
    }

    public boolean existByCodeAndDate(String code, LocalDate date) {
        List<ETFData> list = ETF_DATE_HOLD_MAP.get(code);
        return list.stream()
                .filter(etfData -> etfData.getValueDate().equals(date))
                .count() > 0;
    }

    public List<ETFData> listBetweenDate(String code, LocalDate start, LocalDate end) {
        List<ETFData> list = ETF_DATE_HOLD_MAP.get(code);
        return list.stream().filter(etfData -> !etfData.getValueDate().isBefore(start)
                        && !etfData.getValueDate().isAfter(end))
                .collect(Collectors.toList());
    }

    public void setValue(ETF etf, BigDecimal value) {
        ETFHoldInfo etfHoldInfo = ETF_HOLD_MAP.getOrDefault(etf.getCode(), new ETFHoldInfo(etf));
        etfHoldInfo.setValue(value);
        putETF(etf.getCode(), etfHoldInfo);
    }
}
